#
# Copyright: (c) 2018 Broadcom. All Rights Reserved. "Broadcom" refers to 
# Broadcom Limited and/or its subsidiaries.
# 
# Broadcom Switch Software License
# 
# This license governs the use of the accompanying Broadcom software. Your 
# use of the software indicates your acceptance of the terms and conditions 
# of this license. If you do not agree to the terms and conditions of this 
# license, do not use the software.
# 1. Definitions
#    "Licensor" means any person or entity that distributes its Work.
#    "Software" means the original work of authorship made available under 
#    this license.
#    "Work" means the Software and any additions to or derivative works of 
#    the Software that are made available under this license.
#    The terms "reproduce," "reproduction," "derivative works," and 
#    "distribution" have the meaning as provided under U.S. copyright law.
#    Works, including the Software, are "made available" under this license 
#    by including in or with the Work either (a) a copyright notice 
#    referencing the applicability of this license to the Work, or (b) a copy 
#    of this license.
# 2. Grant of Copyright License
#    Subject to the terms and conditions of this license, each Licensor 
#    grants to you a perpetual, worldwide, non-exclusive, and royalty-free 
#    copyright license to reproduce, prepare derivative works of, publicly 
#    display, publicly perform, sublicense and distribute its Work and any 
#    resulting derivative works in any form.
# 3. Grant of Patent License
#    Subject to the terms and conditions of this license, each Licensor 
#    grants to you a perpetual, worldwide, non-exclusive, and royalty-free 
#    patent license to make, have made, use, offer to sell, sell, import, and 
#    otherwise transfer its Work, in whole or in part. This patent license 
#    applies only to the patent claims licensable by Licensor that would be 
#    infringed by Licensor's Work (or portion thereof) individually and 
#    excluding any combinations with any other materials or technology.
#    If you institute patent litigation against any Licensor (including a 
#    cross-claim or counterclaim in a lawsuit) to enforce any patents that 
#    you allege are infringed by any Work, then your patent license from such 
#    Licensor to the Work shall terminate as of the date such litigation is 
#    filed.
# 4. Redistribution
#    You may reproduce or distribute the Work only if (a) you do so under 
#    this License, (b) you include a complete copy of this License with your 
#    distribution, and (c) you retain without modification any copyright, 
#    patent, trademark, or attribution notices that are present in the Work.
# 5. Derivative Works
#    You may specify that additional or different terms apply to the use, 
#    reproduction, and distribution of your derivative works of the Work 
#    ("Your Terms") only if (a) Your Terms provide that the limitations of 
#    Section 7 apply to your derivative works, and (b) you identify the 
#    specific derivative works that are subject to Your Terms. 
#    Notwithstanding Your Terms, this license (including the redistribution 
#    requirements in Section 4) will continue to apply to the Work itself.
# 6. Trademarks
#    This license does not grant any rights to use any Licensor's or its 
#    affiliates' names, logos, or trademarks, except as necessary to 
#    reproduce the notices described in this license.
# 7. Limitations
#    Platform. The Work and any derivative works thereof may only be used, or 
#    intended for use, with a Broadcom switch integrated circuit.
#    No Reverse Engineering. You will not use the Work to disassemble, 
#    reverse engineer, decompile, or attempt to ascertain the underlying 
#    technology of a Broadcom switch integrated circuit.
# 8. Termination
#    If you violate any term of this license, then your rights under this 
#    license (including the license grants of Sections 2 and 3) will 
#    terminate immediately.
# 9. Disclaimer of Warranty
#    THE WORK IS PROVIDED "AS IS" WITHOUT WARRANTIES OR CONDITIONS OF ANY 
#    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WARRANTIES OR CONDITIONS OF 
#    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR 
#    NON-INFRINGEMENT. YOU BEAR THE RISK OF UNDERTAKING ANY ACTIVITIES UNDER 
#    THIS LICENSE. SOME STATES' CONSUMER LAWS DO NOT ALLOW EXCLUSION OF AN 
#    IMPLIED WARRANTY, SO THIS DISCLAIMER MAY NOT APPLY TO YOU.
# 10. Limitation of Liability
#    EXCEPT AS PROHIBITED BY APPLICABLE LAW, IN NO EVENT AND UNDER NO LEGAL 
#    THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE 
#    SHALL ANY LICENSOR BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT, 
#    INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF 
#    OR RELATED TO THIS LICENSE, THE USE OR INABILITY TO USE THE WORK 
#    (INCLUDING BUT NOT LIMITED TO LOSS OF GOODWILL, BUSINESS INTERRUPTION, 
#    LOST PROFITS OR DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY OTHER 
#    COMMERCIAL DAMAGES OR LOSSES), EVEN IF THE LICENSOR HAS BEEN ADVISED OF 
#    THE POSSIBILITY OF SUCH DAMAGES.
# 
# 
#
# SDKLT demo application.
#
# This make file builds the SDKLT library and a small application on
# top to exercise the logical table (LT) API for switch device
# management.
#
# By default the make file builds the SDK library, the required Linux
# kernel modules and the demo application. Once the SDK library has
# been built, the kernel modules and the application can be built
# separately using the 'kmod' and 'demo' make targets.
#

ifndef SDK
nosdk:; @echo 'The $$SDK environment variable is not set'; exit 1
else

# Default location to look for platform-specific make files
ifndef TARGET_PLATFORM_DIR
TARGET_PLATFORM_DIR = $(SDK)/appl/make
endif

ifndef TARGET_PLATFORM

help:
	@echo
	@echo Broadcom SDKLT demo application makefile.
	@echo
	@echo Please specify a target platform, e.g.:
	@echo
	@echo make TARGET_PLATFORM=native_thsim $(MAKECMDGOALS)
	@echo make TARGET_PLATFORM=xlr_linux $(MAKECMDGOALS)
	@echo

clean: help

else

# Get build configuration for selected target
include $(TARGET_PLATFORM_DIR)/$(TARGET_PLATFORM).mk

# This is where we put the build objects
ifndef BLDDIR
BLDDIR = $(CURDIR)/build/$(TARGET_PLATFORM)
endif

# This is where we deliver the executable
ifndef DSTDIR
DSTDIR = $(BLDDIR)
endif

# Turn on warnings and debug symbols
CFLAGS += -Wall -Werror
CFLAGS += -g

# Always compile for shared library
CFLAGS += -fPIC

# Add default POSIX Threads flags
CFLAGS += -pthread

# Default YAML configuration
include $(SDK)/appl/make/yaml.mk
LDFLAGS += $(YAML_LDFLAGS)
EXTRA_LIBS += $(YAML_LDLIBS)

# We want our own includes before any system includes
CPPFLAGS := -I$(CURDIR) $(CPPFLAGS) $(ADD_CPPFLAGS)
CFLAGS += $(ADD_CFLAGS)
LDFLAGS += $(ADD_LDFLAGS)
EXTRA_LIBS += $(ADD_LDLIBS)

# Support quiet make (make -s)
ifneq (,$(findstring s,$(MAKEFLAGS)))
export ARFLAGS = rc
export Q=@
endif

# Export toolchain
export CC
export AR
export TOOLSDIR
export CROSS_COMPILE

# Build the SDK library from here
SDKLIB = $(SDK)/appl/sdklib

# Build the Linux kernel modules from here
SDKMOD = $(SDK)/appl/linux

# Place the library build objects here
SDK_BLDDIR = $(SDKLIB)/build/$(TARGET_PLATFORM)

# Install SDK header files here
SDK_INCDIR = $(SDK_BLDDIR)/include/sdklt

# Install SDK library files here
SDK_LIBDIR = $(SDK_BLDDIR)/lib

# Main target
all: sdk kmod
	$(MAKE) demo

#
# Configure main application build to incorporate the SDK include
# directories.
#
INCLUDES += -I$(SDK_INCDIR)
OBJS =	main.o version.o
BOBJS = $(addprefix $(BLDDIR)/,$(OBJS))

# Name and destination of executable
PRG = $(DSTDIR)/sdklt$(DSTSUFFIX)

.PHONY: all sdk kmod demo

# Build SDK
sdk:
	$(MAKE) -C $(SDKLIB) TARGET_PLATFORM=$(TARGET_PLATFORM)

# Build Linux kernel modules
kmod:
ifdef KDIR
	$(MAKE) -C $(SDKMOD) TARGET_PLATFORM=$(TARGET_PLATFORM) \
		DSTDIR=$(DSTDIR)
endif

demo: $(PRG)

# Link application objects
LDOBJS = $(BOBJS)

# Link SDK static library
LDLIBS += $(SDK)/appl/sdklib/build/$(TARGET_PLATFORM)/lib/libsdklt.a

# Add POSIX Threads, Real-Time and Dynamic-Load libraries
LDLIBS += $(OPENSRC_LIBS) $(EXTRA_LIBS) -pthread -lrt -ldl

$(PRG): $(BOBJS) $(DSTDIR)/.tree
	@echo 'Linking target application $@'
	$(CC) $(LDFLAGS) $(LDOBJS) $(LDLIBS) -o $@

# Dynamic build information
VERSION_CPPFLAGS += -DVERSION_INFO="$(shell echo \\\"`cat $(SDK)/RELEASE`\\\")"
VERSION_CPPFLAGS += -DDATE_INFO="$(shell echo \\\"`date -R`\\\")"
ifdef SCM_INFO_CMD
SCM_INFO = $(shell echo `$(SCM_INFO_CMD)`)
VERSION_CPPFLAGS += -DSCM_INFO="\"$(SCM_INFO)\""
endif

$(BLDDIR)/version.o: version.c $(BLDDIR)/.tree FORCE
	@echo 'Building application module $@ (forced)'
	$(CC) $(INCLUDES) $(CPPFLAGS) $(VERSION_CPPFLAGS) $(CFLAGS) -c $< -o $@
FORCE:

$(BLDDIR)/%.o: %.c $(BLDDIR)/.tree
	@echo 'Building application module $@'
	$(CC) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

$(BLDDIR)/.tree:
	@echo 'Creating build directory $(BLDDIR)'
	@mkdir -p $(BLDDIR)
	@echo "Build directory $(BLDDIR) created" > $@

ifneq ($(DSTDIR),$(BLDDIR))
$(DSTDIR)/.tree:
	@echo 'Creating target directory $(DSTDIR)'
	@mkdir -p $(DSTDIR)
	@echo "Target directory $(BLDDIR) created" > $@
endif

clean::
	$(MAKE) -C $(SDK)/appl/sdklib TARGET_PLATFORM=$(TARGET_PLATFORM) clean
	rm -f $(PRG) $(BOBJS)

cleanall:: clean

# This target can be used to clean the SDK YAML components without
# rebuilding the entire library.
cleanyaml:
	$(MAKE) -C $(SDK)/appl/sdklib TARGET_PLATFORM=$(TARGET_PLATFORM) cleanyaml

endif # TARGET_PLATFORM

cleanall:: clean

.PHONY: help clean cleanall cleanyaml

endif # defined $SDK
